package com.library.controller;

import com.library.dto.LoginRequest;
import com.library.dto.LoginResponse;
import com.library.dto.RegisterRequest;
import com.library.dto.RegisterResponse;
import com.library.service.AuthService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 认证控制器
 * 处理用户登录、注册、注销等认证相关的HTTP请求
 */
@Slf4j
@RestController
@RequestMapping("/api/auth")
@RequiredArgsConstructor
public class AuthController {
    // 注入认证服务，处理业务逻辑
    private final AuthService authService;

    /**
     * 用户登录接口
     * POST /api/auth/login
     * 验证用户名和密码，返回JWT令牌
     * 
     * @param request 登录请求体，包含用户名和密码
     * @return 登录响应，包含JWT令牌和用户信息
     */
    @PostMapping("/login")
    public ResponseEntity<LoginResponse> login(@Valid @RequestBody LoginRequest request) {
        // 调用服务层处理登录逻辑
        LoginResponse response = authService.login(request);
        // 返回200状态码和响应体
        return ResponseEntity.ok(response);
    }

    /**
     * 用户注册接口
     * POST /api/auth/register
     * 创建新用户账户，密码会自动加密，注册成功后自动登录
     * 
     * @param request 注册请求体，包含用户名和密码
     * @return 注册响应，包含JWT令牌和用户信息
     */
    @PostMapping("/register")
    public ResponseEntity<RegisterResponse> register(@Valid @RequestBody RegisterRequest request) {
        // 调用服务层处理注册逻辑
        // 密码会在服务层使用BCrypt加密
        RegisterResponse response = authService.register(request);
        // 返回200状态码和响应体
        return ResponseEntity.ok(response);
    }

    /**
     * 用户注销接口
     * POST /api/auth/logout
     * 注意：由于使用JWT无状态认证，实际注销由前端删除token实现
     * 此接口主要用于兼容性，实际不做任何操作
     * 
     * @return 注销成功消息
     */
    @PostMapping("/logout")
    public ResponseEntity<Map<String, String>> logout() {
        Map<String, String> response = new HashMap<>();
        response.put("message", "注销成功");
        return ResponseEntity.ok(response);
    }

    /**
     * 获取当前登录用户信息接口
     * GET /api/auth/me
     * 从JWT令牌中提取用户信息并返回
     * 
     * @param userId 用户ID（从JWT过滤器设置的request attribute中获取）
     * @param username 用户名（从JWT过滤器设置的request attribute中获取）
     * @param role 用户角色（从JWT过滤器设置的request attribute中获取）
     * @return 当前用户信息
     */
    @GetMapping("/me")
    public ResponseEntity<Map<String, Object>> getCurrentUser(
            @RequestAttribute Long userId,
            @RequestAttribute String username,
            @RequestAttribute String role) {
        // 构建用户信息对象
        Map<String, Object> user = new HashMap<>();
        user.put("id", userId);
        user.put("username", username);
        user.put("role", role);

        // 构建响应对象
        Map<String, Object> response = new HashMap<>();
        response.put("user", user);
        return ResponseEntity.ok(response);
    }
}

